Effective Java [아이템 19] 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 클래스의 API로 공개된 메서드에서 클래스 자신의 또 다른 메서드를 호출할 수도 있음, 그런데 마침 호출되는 메서드가 재정의 기능 메서드라면 그 사실을 호출하는 메서드의 API 설명에 적시해야함 재정의 가능 메서드를 호출할 수 있는 모든 상황을 문서로 남겨야함 효율적인 하위 클래스를 큰 어려움 없이 만들 수 있게 하려면 클래스의 내부 동작 과정 중간에 끼어들 수 있는 훅(hook)을 잘 선별... Effective JavaEffective Java [아이템 20] 추상 클래스보다는 인터페이스를 우선하라 자바가 제공하는 다중 구현 메커니즘은 인터페이스와 추상 클래스임, 이렇게 두 메커니즘은 모두 인스턴스 메서드를 구현 형태로 제공할 수 있음 인터페이스의 메서드 중 구현 방법이 명백한 것이 있다면, 그 구현을 디폴트 메서드로 제공해 프로그래머들의 일감을 덜어줄 수 있음 인터페이스와 추상 골격 구현 클래스를 함께 제공하는 식으로 인터페이스와 추상 클래스의 장점을 모두 취하는 방법도 있음 추상 골... Effective JavaEffective Java [이펙티브 자바] 클래스와 인터페이스 Item15 - 클래스와 멤버의 접근 권한을 최소화하라 클래스와 멤버의 접근 권한을 최소화하라. 그 중 하나가 접근 제어 메커니즘이다. 이는 클래스, 인터페이스, 멤버의 접근 허용 범위(접근성)를 제어하는 것이다. 이때 접근성은 접근 제한자로 명시될 수 있다. 클래스나 인터페이스, 멤버등의 접근 권한을 명시한다. private - 멤버를 선언한 톱레벨 클래스에서만 접근 가능. package-private - 해당 패키지 안의 모든 클래스에서 접근... 공부Effective Java스터디이펙티브 자바JavaEffective Java [ ITEM 22 ] 인터페이스는 타입을 정의하는 용도로만 사용하라 인터페이스 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할 클래스가 어떤 인터페이스를 구현 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해주는 것 인터페이스는 이 용도로만 사용해야 한다! 상수 인터페이스 상수 인터페이스 메서드 없이, 상수를 뜻하는 static final 필드로만 가득 찬 인터페이스 정규화된 이름을 쓰는 걸 피하고자 인터페이스를 구현하곤 한다. 상수 ... Effective Java이펙티브 자바Effective Java [이펙티브 자바] 클래스와 인터페이스 Item16 - public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 자바에서는 추상화의 기본 단위로 클래스(Class)와 인터페이스(Interface) 를 정의하고 있고, 이는 곧 자바의 심장과도 같다. 다른 컴포넌트에서 해당 클래스 데이터 필드에 직접 접근이 가능하다. 그 말은, 캡슐화(Encapsulation)가 전혀 안되기 때문에 그에 따른 장점도 얻을 수 없다는 말이다. API를 수정하지 않고는 내부 표현을 바꿀 수 없다. 불변식을 보장할 수 없다. ... 자바공부Effective Java스터디이펙티브 자바JavaEffective Java [이펙티브 자바] 클래스와 인터페이스 Item17 - 변경 가능성을 최소화하라 일반적으로 불변 클래스는 가변 클래스에 비해 설계하고 구현하고 사용하기가 쉽고, 그 외에, 인스턴스의 값을 변경할 수 있는 로직이 들어가는 메서드는 안된다. 클래스를 확장할 수 없도록 한다. 기술적으로 기본 타입 필드나 불변 객체를 참조하는 필드를 public final로만 선언해도 불변은 된다. 코드에서 사칙연산 부분을 보면, 인스턴스 본인의 필드 값을 바꾸지 않고 결과만 리턴하는 것을 볼... 자바공부Effective Java스터디이펙티브 자바JavaEffective Java 이펙티브 자바 아이템6 정리 String 인스턴스 아래 코드는 실행 될 때 마다 String 인스턴스를 새로 만든다. 아래 코드는 새로운 인스턴스를 만들지만 하나의 String 인스턴스를 사용한다. 이 방법은 문자열 리터럴 생성 방식으로 String Contstant Pool이란 영역에 저장된다. String.maches()의 성능 이슈 아래 코드는 String.marches의 내부 코드다. 코드를 보면 matches를... Effective Java이펙티브 자바Effective Java 69. 예외는 진짜 예외 상황에만 사용하라 예외 상황 예외를 완전히 잘못 사용한 예 따라서 이 검사를 반복문에도 적용할 경우 같은 일이 중복되므로 하나를 생략한 것이다. 하지만 이 추론은 세 가지 근거에서 잘못됐다. 예외는 예외 상황에 쓸 용도로 설계되었기 때문에 JVM 구현자 입장에서는 명확한 검사만큼 빠르게 만들어야 할 동기가 약하다. 코드를 try-catch 블록 안에 넣으면 JVM이 적용할 수 있는 최적화가 제한된다. 이 원칙... Effective JavaEffective Java 객체 생성과 파괴(1) 클래스는 생성자와 별도로 정적 팩터리 메서드를 제공 할 수 있다. 클래스는 public 생성자 대신 정적 팩터리 메서드를 제공할 수 있다. 1. 이름을 가질 수 있다. 반면 정적 팩터리는 객체의 특성을 쉽게 묘사 할 수 있다. 반복되는 요청에 같은 객체를 반환하는 식으로 정적 팩터리 방식의 클래스는 언제 어느 인스턴스를 살아 있게 할지를 철저히 통제 할 수 있다. 또한 불변 값 클래스에서 동... Effective JavaEffective Java [아이템 6] 불필요한 객체 생성을 피하라 이 방식을 사용하면 같은 가상 머신 안에서 이와 똑같은 문자열 리터럴을 사용하는 모든 코드가 같은 객체를 재사용함이 보장됨 그래서 이를 확인하기 위해서 String에서 intern()이라는 메서드를 사용할 수 있는데 여기서 이 메서드를 통해서 Pool에 있다면 해당 주소를 없다면 생성한 주소를 반환함으로써 이를 확인할 수 있음 생성자 대신 정적 팩터리 메서드를 제공하는 불변 클래스에서는 정적... Effective JavaEffective Java [이펙티브 자바] 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라 싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든 싱글턴이 아니라면 싱글턴 인스턴스를 가짜(mock) 구현으로 대체할 수 없기 때문이다. 싱글턴을 만드는 방식은 보통 두 가지다. 두 방식 모두 생성자는 private으로 감춰두고, 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 하나 마... 생성자열거 타입싱글턴이펙티브 자바Effective Java자바Enumprivate 생성자나 열거 타입으로 싱글턴임을 보증하라Singletonprivate 생성자Effective Java [이펙티브 자바] 아이템 4. 인스턴스화를 막으려거든 private 생성자를 사용하라 이펙티브 자바를 읽고 정리한 글입니다. 객체 지향적으로 사고하지 않는 이들이 종종 남용하는 방식이지만, 정적 메서드와 정적 필드만을 담은 클래스를 만들 때가 있다. java.lang.Math, java.util.Arrays 등 final 클래스와 관련한 메서드들을 모아놓을 때도 사용 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 게 아니다. 하지만 생성자를 명시하지 않으... 인스턴스화를 막으려거든 private 생성자를 사용하라Effective Java자바private 생성자인스턴스이펙티브 자바인스턴스화Effective Java [이펙티브 자바] 아이템 9. try-finally보다는 try-with-resources를 사용하라 자바 라이브러리에는 InputStream, OutputStream, java.sql.Connection 등 close 메서드를 호출해 직접 닫아줘야 하는 자원이 많다. 자원 닫기는 클라이언트가 놓치기 쉬워서 예측할 수 없는 성능 문제로 이어지기도 한다. 전통적으로 자원이 제대로 닫힘을 보장하는 수단으로 try-finally가 쓰였다. 예외는 try 블록과 finally 블록 모두에서 발생할 ... try-finally보다는 try-with-resources를 사용하라try-with-resourcesEffective Javatry-finally자바이펙티브 자바Effective Java
[아이템 19] 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 클래스의 API로 공개된 메서드에서 클래스 자신의 또 다른 메서드를 호출할 수도 있음, 그런데 마침 호출되는 메서드가 재정의 기능 메서드라면 그 사실을 호출하는 메서드의 API 설명에 적시해야함 재정의 가능 메서드를 호출할 수 있는 모든 상황을 문서로 남겨야함 효율적인 하위 클래스를 큰 어려움 없이 만들 수 있게 하려면 클래스의 내부 동작 과정 중간에 끼어들 수 있는 훅(hook)을 잘 선별... Effective JavaEffective Java [아이템 20] 추상 클래스보다는 인터페이스를 우선하라 자바가 제공하는 다중 구현 메커니즘은 인터페이스와 추상 클래스임, 이렇게 두 메커니즘은 모두 인스턴스 메서드를 구현 형태로 제공할 수 있음 인터페이스의 메서드 중 구현 방법이 명백한 것이 있다면, 그 구현을 디폴트 메서드로 제공해 프로그래머들의 일감을 덜어줄 수 있음 인터페이스와 추상 골격 구현 클래스를 함께 제공하는 식으로 인터페이스와 추상 클래스의 장점을 모두 취하는 방법도 있음 추상 골... Effective JavaEffective Java [이펙티브 자바] 클래스와 인터페이스 Item15 - 클래스와 멤버의 접근 권한을 최소화하라 클래스와 멤버의 접근 권한을 최소화하라. 그 중 하나가 접근 제어 메커니즘이다. 이는 클래스, 인터페이스, 멤버의 접근 허용 범위(접근성)를 제어하는 것이다. 이때 접근성은 접근 제한자로 명시될 수 있다. 클래스나 인터페이스, 멤버등의 접근 권한을 명시한다. private - 멤버를 선언한 톱레벨 클래스에서만 접근 가능. package-private - 해당 패키지 안의 모든 클래스에서 접근... 공부Effective Java스터디이펙티브 자바JavaEffective Java [ ITEM 22 ] 인터페이스는 타입을 정의하는 용도로만 사용하라 인터페이스 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할 클래스가 어떤 인터페이스를 구현 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해주는 것 인터페이스는 이 용도로만 사용해야 한다! 상수 인터페이스 상수 인터페이스 메서드 없이, 상수를 뜻하는 static final 필드로만 가득 찬 인터페이스 정규화된 이름을 쓰는 걸 피하고자 인터페이스를 구현하곤 한다. 상수 ... Effective Java이펙티브 자바Effective Java [이펙티브 자바] 클래스와 인터페이스 Item16 - public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 자바에서는 추상화의 기본 단위로 클래스(Class)와 인터페이스(Interface) 를 정의하고 있고, 이는 곧 자바의 심장과도 같다. 다른 컴포넌트에서 해당 클래스 데이터 필드에 직접 접근이 가능하다. 그 말은, 캡슐화(Encapsulation)가 전혀 안되기 때문에 그에 따른 장점도 얻을 수 없다는 말이다. API를 수정하지 않고는 내부 표현을 바꿀 수 없다. 불변식을 보장할 수 없다. ... 자바공부Effective Java스터디이펙티브 자바JavaEffective Java [이펙티브 자바] 클래스와 인터페이스 Item17 - 변경 가능성을 최소화하라 일반적으로 불변 클래스는 가변 클래스에 비해 설계하고 구현하고 사용하기가 쉽고, 그 외에, 인스턴스의 값을 변경할 수 있는 로직이 들어가는 메서드는 안된다. 클래스를 확장할 수 없도록 한다. 기술적으로 기본 타입 필드나 불변 객체를 참조하는 필드를 public final로만 선언해도 불변은 된다. 코드에서 사칙연산 부분을 보면, 인스턴스 본인의 필드 값을 바꾸지 않고 결과만 리턴하는 것을 볼... 자바공부Effective Java스터디이펙티브 자바JavaEffective Java 이펙티브 자바 아이템6 정리 String 인스턴스 아래 코드는 실행 될 때 마다 String 인스턴스를 새로 만든다. 아래 코드는 새로운 인스턴스를 만들지만 하나의 String 인스턴스를 사용한다. 이 방법은 문자열 리터럴 생성 방식으로 String Contstant Pool이란 영역에 저장된다. String.maches()의 성능 이슈 아래 코드는 String.marches의 내부 코드다. 코드를 보면 matches를... Effective Java이펙티브 자바Effective Java 69. 예외는 진짜 예외 상황에만 사용하라 예외 상황 예외를 완전히 잘못 사용한 예 따라서 이 검사를 반복문에도 적용할 경우 같은 일이 중복되므로 하나를 생략한 것이다. 하지만 이 추론은 세 가지 근거에서 잘못됐다. 예외는 예외 상황에 쓸 용도로 설계되었기 때문에 JVM 구현자 입장에서는 명확한 검사만큼 빠르게 만들어야 할 동기가 약하다. 코드를 try-catch 블록 안에 넣으면 JVM이 적용할 수 있는 최적화가 제한된다. 이 원칙... Effective JavaEffective Java 객체 생성과 파괴(1) 클래스는 생성자와 별도로 정적 팩터리 메서드를 제공 할 수 있다. 클래스는 public 생성자 대신 정적 팩터리 메서드를 제공할 수 있다. 1. 이름을 가질 수 있다. 반면 정적 팩터리는 객체의 특성을 쉽게 묘사 할 수 있다. 반복되는 요청에 같은 객체를 반환하는 식으로 정적 팩터리 방식의 클래스는 언제 어느 인스턴스를 살아 있게 할지를 철저히 통제 할 수 있다. 또한 불변 값 클래스에서 동... Effective JavaEffective Java [아이템 6] 불필요한 객체 생성을 피하라 이 방식을 사용하면 같은 가상 머신 안에서 이와 똑같은 문자열 리터럴을 사용하는 모든 코드가 같은 객체를 재사용함이 보장됨 그래서 이를 확인하기 위해서 String에서 intern()이라는 메서드를 사용할 수 있는데 여기서 이 메서드를 통해서 Pool에 있다면 해당 주소를 없다면 생성한 주소를 반환함으로써 이를 확인할 수 있음 생성자 대신 정적 팩터리 메서드를 제공하는 불변 클래스에서는 정적... Effective JavaEffective Java [이펙티브 자바] 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라 싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든 싱글턴이 아니라면 싱글턴 인스턴스를 가짜(mock) 구현으로 대체할 수 없기 때문이다. 싱글턴을 만드는 방식은 보통 두 가지다. 두 방식 모두 생성자는 private으로 감춰두고, 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 하나 마... 생성자열거 타입싱글턴이펙티브 자바Effective Java자바Enumprivate 생성자나 열거 타입으로 싱글턴임을 보증하라Singletonprivate 생성자Effective Java [이펙티브 자바] 아이템 4. 인스턴스화를 막으려거든 private 생성자를 사용하라 이펙티브 자바를 읽고 정리한 글입니다. 객체 지향적으로 사고하지 않는 이들이 종종 남용하는 방식이지만, 정적 메서드와 정적 필드만을 담은 클래스를 만들 때가 있다. java.lang.Math, java.util.Arrays 등 final 클래스와 관련한 메서드들을 모아놓을 때도 사용 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 게 아니다. 하지만 생성자를 명시하지 않으... 인스턴스화를 막으려거든 private 생성자를 사용하라Effective Java자바private 생성자인스턴스이펙티브 자바인스턴스화Effective Java [이펙티브 자바] 아이템 9. try-finally보다는 try-with-resources를 사용하라 자바 라이브러리에는 InputStream, OutputStream, java.sql.Connection 등 close 메서드를 호출해 직접 닫아줘야 하는 자원이 많다. 자원 닫기는 클라이언트가 놓치기 쉬워서 예측할 수 없는 성능 문제로 이어지기도 한다. 전통적으로 자원이 제대로 닫힘을 보장하는 수단으로 try-finally가 쓰였다. 예외는 try 블록과 finally 블록 모두에서 발생할 ... try-finally보다는 try-with-resources를 사용하라try-with-resourcesEffective Javatry-finally자바이펙티브 자바Effective Java